part of "../basic.dart";

extension IterableExtension<T> on Iterable<T> {
  T? findWhere(Test<T> test) {
    List<T> list = toList();
    int index = list.indexWhere(test);
    return index == -1 ? null : list[index];
  }

  /// 检查是否至少包含一个满足条件的对象
  bool containsWhere(Test<T> test) {
    return findWhere(test) != null;
  }

  /// 从列表中随机选择一个
  T get random => toList()[Random().nextInt(length)];
}

extension ListExtension<T> on List<T> {
  /// 如果该项已经存在，则忽略，否则添加
  void tryAdd(T item) => contains(item) ? null : add(item);

  /// 返回序号，它的本质其实就是index+1，比如在展示有序列表的时候挺有用
  @Deprecated("使用index，不要另搞一套")
  int orderOf(T item) {
    int index = indexOf(item);
    if (index == -1) throw Bug("item并不在列表内，找不到它的序号");
    return index + 1;
  }

  /// 在列表中间隔加入某一项，比如1,2,3间隔加入0，就会变成1,0,2,0,3
  List<T> withInterval(T item) {
    if (isEmpty) return []; // 空列表直接返回空列表
    List<T> newList = [];
    for (int i = 0; i < length; i++) {
      newList.add(this[i]);
      if (i < length - 1) {
        // 避免在最后一个元素后也插入
        newList.add(item);
      }
    }
    return newList;
  }
}
